/*
 * main.c
 *
 *  Created on: 13/03/2011
 *      Author: joao
 */

#include <stdio.h>

#define FIM -1
#define MAX 10
typedef int TipoDoElemento;
typedef int TipoDaPosicao;

typedef struct {
int comp; /* comp = 0, quando a lista esta vazia. */
TipoDoElemento elementos[MAX];
} Lista;

void inicializa(Lista *l) {
l->comp = 0;
}

void adiciona(TipoDoElemento x, Lista *l) {
if (l->comp < MAX) {
l->elementos[l->comp] = x;
l->comp++;
}
else
printf("Erro, lista cheia (overflow)\n");
}

TipoDoElemento acessa(TipoDaPosicao p, Lista *l) {
if (p <= l->comp)
return(l->elementos[p - 1]);
else
return 0;
}

TipoDaPosicao primeiro(Lista *l){
	if (l->comp==0) return FIM;
	else return 1;
}

TipoDaPosicao localiza(TipoDoElemento x, Lista *l){
	int i;

	for(i=0; i<l->comp; i++){
		if(x==l->elementos[i])return (i+1);
	}
	return 0;
}

TipoDaPosicao proximo (TipoDaPosicao p, Lista *l){
	if (p==l->comp)return FIM;
	else return (p+1);
}

void insere(TipoDoElemento x, TipoDaPosicao p, Lista *l){
	int i;

	if (l->comp < MAX){
		for(i=(MAX-1);i>=(p-1); i--){
			l->elementos[i]=l->elementos[i-1];

		}
		l->elementos[p-1]=x;
		l->comp++;
	}
	else printf("Erro, lista cheia (overflow)\n");
	}

void remova(TipoDaPosicao p, Lista *l){
	int i;

	for (i=(p-1);i<(MAX-1); i++){
		l->elementos[i]=l->elementos[i+1];
	}
	l->comp--;
}

int vazia(Lista *l){
	if (l->comp==0) return 1;
	else return 0;
}

TipoDaPosicao comprimento(Lista *l){
	return (l->comp);
}

void imprime(Lista *l){
	int i;

	for(i=0; i<l->comp; i++){
		printf("%d, ", l->elementos[i]);
		};
}

void eliminar (Lista *l){
	int p, aux, q;

	p = primeiro(l);
	while(p != FIM){
		aux = p;
		q = proximo(p, l);
		while (q != FIM){
			if (acessa(p, l) == acessa(q, l)){
				remova(q, l);
				q = proximo(aux,l);
			}
			else aux = q;
			q = proximo(q, l);
		}
		p = proximo(p, l);

	}

}

void ordena(Lista *l){
	int trocou=1, i, aux;

	while(trocou==1){
	trocou=0;
	for (i=1; i<(l->comp); i++){
		if(l->elementos[i-1]>l->elementos[i]){
			aux=l->elementos[i-1];
			l->elementos[i-1]=l->elementos[i];
			l->elementos[i]=aux;
			trocou=1;
		}
	}
	}

}

Lista intercala(Lista *l1, Lista *l2){
	int adicionou, vazia1, vazia2;
	Lista lfinal;

	while(adicionou==1){
		vazia1=vazia(l1);
		vazia2=vazia(l2);

		if(vazia1==1 && vazia2==1) adicionou=0;
		if(vazia1==1 && vazia2==0){
			adiciona(l2->elementos[0],&lfinal);
			remova(1, l2);
			adicionou=1;
		}
		if(vazia1==0 && vazia2==1){
			adiciona(l1->elementos[0],&lfinal);
			remova(1, l1);
			adicionou=1;
		}
		if(vazia1==0 && vazia2==0){
			if (l1->elementos[0]<l2->elementos[0]){
				adiciona(l1->elementos[0],&lfinal);
				remova(1, l1);
			}
			else {
				adiciona(l2->elementos[0],&lfinal);
				remova(1, l2);
			}
			adicionou=1;
		}
	}
	return lfinal;
}

int main(){

//	int p;
	Lista MinhaLista;

	inicializa(&MinhaLista);

	adiciona(35, &MinhaLista);
	adiciona(23, &MinhaLista);
	adiciona(33, &MinhaLista);
	adiciona(45, &MinhaLista);
	adiciona(10, &MinhaLista);

//	p=proximo(3,&MinhaLista);
//	remova (1, &MinhaLista);
//	insere(7,2, &MinhaLista);
//	p=localiza(45, &MinhaLista);
//	printf("%d", p);

	printf("\n comp=%d \n", MinhaLista.comp);

	imprime(&MinhaLista);

//	ordena(&MinhaLista);
//	eliminar(&MinhaLista);
//	imprime(&MinhaLista);

	return 0;
}
